/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sv.com.intesal.compra.controlador;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import sv.com.intesal.clases.Mensaje;
import sv.com.intesal.clases.ReportExcel;
import sv.com.intesal.clases.RutaProyecto;
import sv.com.intesal.clases.XMLReporte;
import sv.com.intesal.clases.cVarios;
import sv.com.intesal.compra.bean.Ajuste;
import sv.com.intesal.compra.sql.SQLAjuste;
import sv.com.intesal.conexion.cConexion;
import sv.com.intesal.seguridad.bean.ParametroSicopi;
import sv.com.intesal.seguridad.controlador.BitacoraControlador;
import sv.com.intesal.seguridad.controlador.ParametroSicopiControlador;
import sv.com.intesal.seguridad.controlador.SessionControlador;

/**
 *
 * @author JM
 */
public class AjusteControlador {

    public void setEncaAjuste(Ajuste aj, List<Ajuste> listaAj) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;

        try {

            cnn = cConexion.conectar();
            if (aj.getId_aj() == null) {
                SessionControlador sc = new SessionControlador();
                ParametroSicopiControlador pc = new ParametroSicopiControlador();
                ParametroSicopi pp = pc.getParametroSicopi("AJUSTE_MATERIAL");

                /*INSERT*/
                ps = cnn.prepareStatement(SQLAjuste.insertEncaAjuaste);
                ps.setInt(1, sc.getCodigo_Sucursal());
                ps.setInt(2, sc.getCodigo_Usuario());
                ps.setDate(3, cVarios.getFecha(aj.getFecha_aj()));
                ps.setString(4, aj.getDescripcion_aj());
                ps.setInt(5, pp.getBloque_ps());
                ps.setInt(6, pp.getCorrelativo_ps());
                ps.executeUpdate();

                //ACTUALIZAR NUMERO DE DOCUMENTO
                pc.updateCorrelativo("AJUSTE_MATERIAL");
                listaAj.get(0).setNumero_documento_aj(pp.getCorrelativo_ps());
            } else {
                /*MODIFICAR*/
                ps = cnn.prepareStatement(SQLAjuste.modificarEncaAjuste);
                ps.setDate(1, cVarios.getFecha(aj.getFecha_aj()));
                ps.setString(2, aj.getDescripcion_aj());
                ps.setInt(3, aj.getBloque_aj());
                ps.setInt(4, aj.getNumero_documento_aj());
                ps.setInt(5, aj.getId_aj());
                ps.executeUpdate();

                listaAj.get(0).setNumero_documento_aj(aj.getNumero_documento_aj());
            }

            this.setDetaAjuste(aj, listaAj);

            Mensaje m = new Mensaje();
            if (aj.getId_aj() == null) {
                m.messageInfo(m.getIinformation());
            } else {
                m.messageInfo(m.getImodificada());
            }
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setDetaAjuste(Ajuste aj, List<Ajuste> listaAj) throws Exception {
        try {
            Integer codigo_aj = aj.getId_aj();
            if (aj.getId_aj() == null) {
                codigo_aj = this.getMax();
            }
            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < listaAj.size(); i++) {
                if (listaAj.get(i).getId_d() == 0) {

                    PreparedStatement ps = null;
                    Connection cnn = null;
                    cnn = cConexion.conectar();
                    ps = cnn.prepareStatement(SQLAjuste.insertDetaAjuste);

                    ps.setInt(1, listaAj.get(i).getId_dm());
                    ps.setInt(2, codigo_aj);
                    ps.setDouble(3, listaAj.get(i).getCantidad_d());

                    if (listaAj.get(i).getTipo_d() == "Entrada") {
                        ps.setString(4, "E");
                    } else if (listaAj.get(i).getTipo_d().equals("Entrada")) {
                        ps.setString(4, "E");
                    } else {
                        ps.setString(4, "S");
                    }

                    ps.executeUpdate();
                    ps.close();

                    //cnn.close();
                    //E=ENTRADA
                    if (listaAj.get(i).getTipo_d().equals("Entrada")) {
                        mc.setCantidadMaterial_Aumentar_Disminuir(codigo_aj, listaAj.get(i).getId_dm(), listaAj.get(i).getCantidad_d(), "A", bc.ingresarAjuste + ": " + listaAj.get(0).getNumero_documento_aj(), listaAj.get(0).getNumero_documento_aj().toString(), bc.ingresarAjuste);
                    } else {
                        mc.setCantidadMaterial_Aumentar_Disminuir(codigo_aj, listaAj.get(i).getId_dm(), listaAj.get(i).getCantidad_d(), "D", bc.ingresarAjuste + ": " + listaAj.get(0).getNumero_documento_aj(), listaAj.get(0).getNumero_documento_aj().toString(), bc.ingresarAjuste);
                    }
                }
            }

        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void setEliminarItem(Ajuste aj) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLAjuste.eliminarDetaItem);
            ps.setInt(1, aj.getId_d());
            ps.executeUpdate();

            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            if (aj.getTipo_d().equals("Salida")) {
                /*salida quitas del inventario, si elimnas lo que quitas es un AUMENTO*/
                mc.setCantidadMaterial_Aumentar_Disminuir(aj.getId_aj(), aj.getId_dm(), aj.getCantidad_d(), "A", bc.eliminarItemAjuste + ": " + aj.getNumero_documento_aj(), aj.getNumero_documento_aj().toString(), bc.eliminarItemAjuste);
            } else {
                mc.setCantidadMaterial_Aumentar_Disminuir(aj.getId_aj(), aj.getId_dm(), aj.getCantidad_d(), "D", bc.eliminarItemAjuste + ": " + aj.getNumero_documento_aj(), aj.getNumero_documento_aj().toString(), bc.eliminarItemAjuste);
            }
            bc.setBitacoraAnulacion(aj.getId_aj(), bc.eliminarItemAjuste + ": " + aj.getNumero_documento_aj(), bc.eliminarItemAjuste);

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIeliminada());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Integer getMax() throws Exception {
        try {
            ResultSet rs = cConexion.conectar().prepareStatement(SQLAjuste.getMax).executeQuery();
            rs.next();
            return rs.getInt("max");
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validar_ItemEliminarAjuste(Ajuste aj) throws Exception {

        try {
            MaterialControlador mc = new MaterialControlador();

            if (mc.validar_cantidad(aj.getId_dm(), aj.getCantidad_d()) == false) {
                return false;
            }
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public List<Ajuste> getConsulta_EncaAjuste(Ajuste a) throws Exception {

        List<Ajuste> lista = new ArrayList<Ajuste>();
        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {

            cnn = cConexion.conectar();

            String var_estado = " and aj.estado_aj='AC' ";
            String var_fechas = this.getFiltro_Fechas(a);

            if (a.getFiltrar_estado() == true) {
                var_estado = " "; //trae todos los estados.
            }

            String sql = "select aj.id_aj,aj.bloque_aj,aj.numero_documento_aj,aj.fecha_aj,aj.fechahora,aj.descripcion_aj,aj.estado_aj,u.id_u,u.usuario_u,s.codigo_s,s.nombre_s  FROM AJUSTE aj,SUCURSAL as s,USUARIO as u where u.id_u=aj.id_u and s.codigo_s=aj.codigo_s "
                    + var_estado + var_fechas + " order by aj.fecha_aj,aj.numero_documento_aj";
            ps = cnn.prepareStatement(sql);
            rs = ps.executeQuery();

            while (rs.next()) {
                Ajuste aj = new Ajuste();

                aj.setId_aj(rs.getInt("id_aj"));
                aj.setBloque_aj(rs.getInt("bloque_aj"));
                aj.setNumero_documento_aj(rs.getInt("numero_documento_aj"));
                aj.setFecha_aj(rs.getDate("fecha_aj"));
                aj.setFechahora(rs.getTimestamp("fechahora"));
                aj.setDescripcion_aj(rs.getString("descripcion_aj"));
                aj.setEstado_aj(rs.getString("estado_aj"));

                /* SUCURSAL */
                aj.setCodigo_s(rs.getInt("codigo_s"));
                aj.setNombre_s(rs.getString("nombre_s"));

                /* USUARIO */
                aj.setId_u(rs.getInt("id_u"));
                aj.setUsuario_u(rs.getString("usuario_u"));
                lista.add(aj);
            }

            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public List<Ajuste> getDeta_Ajuste(Integer codigo_aj) throws Exception {

        List<Ajuste> lista = new ArrayList<Ajuste>();
        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLAjuste.getConsulta_DetaAjuste);
            ps.setInt(1, codigo_aj);
            rs = ps.executeQuery();

            while (rs.next()) {
                Ajuste aj = new Ajuste();

                /*ENCA*/
                aj.setId_aj(rs.getInt("id_aj"));
//                aj.setFecha_aj(rs.getDate("fecha_aj"));
//                aj.setFechahora(rs.getTimestamp("fechahora"));
//                aj.setBloque_aj(rs.getInt("bloque_aj"));
//                aj.setNumero_documento_aj(rs.getInt("numero_documento_aj"));
//                aj.setDescripcion_aj(rs.getString("descripcion_aj"));
//                aj.setEstado_aj(rs.getString("estado_aj"));

                /* DETA */
                aj.setId_d(rs.getInt("id_d"));
                if (rs.getString("tipo_d").equals("S")) {
                    aj.setTipo_d("Salida");
                } else {
                    aj.setTipo_d("Entrada");
                }

                aj.setCantidad_d(rs.getDouble("cantidad_d"));
                aj.setId_dm(rs.getInt("id_dm"));

                /* MATERIAL */
                aj.setNombre_m(rs.getString("nombre_m"));
                lista.add(aj);
            }
            return lista;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void modificarAjuste(Ajuste aj) throws Exception {
        try {
            SessionControlador sc = new SessionControlador();
            sc.redireccionar_Codigo_Proceso_Modifcar(aj.getId_aj(), RutaProyecto.wfrmAjuste);
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void anularAjuste(List<Ajuste> lista) throws Exception {
        try {
            MaterialControlador mc = new MaterialControlador();
            BitacoraControlador bc = new BitacoraControlador();

            for (int i = 0; i < lista.size(); i++) {

                if (lista.get(i).getTipo_d().equals("Salida")) {
                    mc.setCantidadMaterial_Aumentar_Disminuir(lista.get(0).getId_aj(), lista.get(i).getId_dm(), lista.get(i).getCantidad_d(), "A", bc.anulacionAjuste + ": " + lista.get(0).getNumero_documento_aj(), lista.get(0).getNumero_documento_aj().toString(), bc.anulacionAjuste);
                } else {
                    mc.setCantidadMaterial_Aumentar_Disminuir(lista.get(0).getId_aj(), lista.get(i).getId_dm(), lista.get(i).getCantidad_d(), "D", bc.anulacionAjuste + ": " + lista.get(0).getNumero_documento_aj(), lista.get(0).getNumero_documento_aj().toString(), bc.anulacionAjuste);
                }
            }
            bc.setBitacoraAnulacion(lista.get(0).getId_aj(), bc.anulacionAjuste + ": " + lista.get(0).getNumero_documento_aj(), bc.anulacionAjuste);

            Mensaje m = new Mensaje();
            m.messageInfo(m.getIanulada());

            this.cambiarEstado("A", lista.get(0).getId_aj());
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void cambiarEstado(String estado, Integer codigo_dp) throws Exception {

        try {
            PreparedStatement ps = null;
            Connection cnn = null;
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLAjuste.cambiarEstado);
            ps.setString(1, estado);
            ps.setInt(2, codigo_dp);
            ps.executeUpdate();
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Ajuste getEnca(Integer codigo_aj) throws Exception {

        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

        try {
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLAjuste.getEncaAJ);
            ps.setInt(1, codigo_aj);
            rs = ps.executeQuery();
            rs.next();

            Ajuste aj = new Ajuste();

            aj.setId_aj(rs.getInt("id_aj"));
            aj.setBloque_aj(rs.getInt("bloque_aj"));
            aj.setNumero_documento_aj(rs.getInt("numero_documento_aj"));
            aj.setFecha_aj(rs.getDate("fecha_aj"));
            aj.setFechahora(rs.getTimestamp("fechahora"));
            aj.setDescripcion_aj(rs.getString("descripcion_aj"));
            aj.setEstado_aj(rs.getString("estado_aj"));

            /* SUCURSAL */
            aj.setCodigo_s(rs.getInt("codigo_s"));
            aj.setNombre_s(rs.getString("nombre_s"));

            /* USUARIO */
            aj.setId_u(rs.getInt("id_u"));
            aj.setUsuario_u(rs.getString("usuario_u"));

            cnn.close();
            ps.close();
            rs.close();

            return aj;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public Boolean validarCantidad_AnularAjuste(Integer codigo_aj) throws Exception {
        Connection cnn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            Boolean var_return = true;
            cnn = cConexion.conectar();
            ps = cnn.prepareStatement(SQLAjuste.validarCantidadAnular);
            ps.setInt(1, codigo_aj);
            rs = ps.executeQuery();

            /*
            Si suma es menor que cero entonces ecenario EXITO. Como anulamos Aumentamos el inventario.
            Si es menor que cero entonces hay que evaluar. Si Suma del RS es MAYOR que la existencia de la BD entonces ERROR.
            else ESCENARIO EXITO.
             */
            Mensaje m = new Mensaje();
            MaterialControlador mc = new MaterialControlador();
            while (rs.next()) {
                if (rs.getDouble("suma") > 0) {
                    if (mc.validar_cantidad(rs.getInt("id_dm"), rs.getDouble("suma")) == false) {
                        var_return = false;
                        //m.messageAdvertencia("id_dm=" + rs.getInt("id_dm") + ", suma=" + rs.getDouble("suma") + ": " + rs.getString("nombre_m"));
                        m.messageAdvertencia(m.getIcantidad() + ": " + rs.getString("nombre_m"));
                    }
                }
            }
            ps.close();
            rs.close();
            cnn.close();
            return var_return;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    private String getFiltro_Fechas(Ajuste a) throws Exception {
        try {
            String var_fechas = " ";
             if (a.getFecha_i() != null && a.getFecha_f() == null) {
                var_fechas = " and aj.fecha_aj >='" + cVarios.getFecha(a.getFecha_i()) + "' ";
            } else if (a.getFecha_f() != null && a.getFecha_i() == null) {
                var_fechas = " and aj.fecha_aj <='" + cVarios.getFecha(a.getFecha_f()) + "' ";
            } else if (a.getFecha_i() == null && a.getFecha_f() == null) {
                var_fechas = " ";
            } else {
                var_fechas = " and aj.fecha_aj between '" + cVarios.getFecha(a.getFecha_i()) + "' and '" + cVarios.getFecha(a.getFecha_f()) + "' ";
            }

            return var_fechas;
        } catch (Exception e) {
            throw new Exception(e);
        }
    }

    public void generarReporte_Ajuste(Ajuste a) throws Exception {
        try {
            String var_fechas = this.getFiltro_Fechas(a);
            String var_estado = " and aj.estado_aj='AC' ";
            String var_codigo = " ";


            if (a.getFiltrar_estado() == true) {
                var_estado = " ";
            }
            if (a.getId_aj() != null) {
                var_codigo = " and aj.id_aj=" + a.getId_aj() + " ";
            }
            String sql = "select aj.id_aj,aj.codigo_s,aj.descripcion_aj,aj.bloque_aj,aj.numero_documento_aj,aj.estado_aj,aj.fecha_aj,aj.fechahora,m.nombre_m,u.usuario_u,d.cantidad_d,d.tipo_d from AJUSTE as aj,DETA_AJUSTE as d,SUCURSAL as s,MATERIAL_SUCURSAL as ms,MATERIAL as m,USUARIO as u where aj.id_aj=d.id_aj and s.codigo_s=aj.codigo_s and ms.id_dm=d.id_dm and m.id_m=ms.id_m and u.id_u=aj.id_u "
                    + var_fechas + var_estado + var_codigo + " order by s.codigo_s,aj.fecha_aj,aj.fechahora,aj.numero_documento_aj,m.nombre_m";

            XMLReporte xml = new XMLReporte();
            xml.Element_XML(sql);



            ReportExcel re = new ReportExcel();
            re.excel();
            re.excel_(sql);

        } catch (Exception e) {
            throw new Exception(e);
        }
    }
}
